﻿using GDM.Hogar.Entidades;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Repositorios.Contratos;
using GDM.Hogar.Repositorios.Core;
using GDM.Hogar.Repositorios.Soporte;
using GDM.Hogar.Soporte.Helpers;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace GDM.Hogar.Repositorios
{
    public class IntegranteRepositorio : Repositorio, IIntegranteRepositorio
    {
        public IntegranteRepositorio(IDbManager dbManager)
            : base(dbManager)
        {
        }

        protected override string ProcActualizar
        {
            get
            {
                return ProcedimientosAlmacenados.Integrante.Actualizar;
            }
        }

        public void ActivarIntegrante(int integranteId, bool activo, string motivo = null)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@IntegranteId", DbType.Int64, ParameterDirection.Input, integranteId));
            parametros.Add(CrearParametro("@Activo", DbType.Boolean, ParameterDirection.Input, activo));
            if (motivo != null)
                parametros.Add(CrearParametro("@ObservacionBaja", DbType.String, ParameterDirection.Input, motivo));
            EjecutarConsulta(ProcedimientosAlmacenados.Integrante.Activar, parametros);
        }

        public void ActualizarIntegrante(string integrante)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@IntegranteAsXml", DbType.Xml, ParameterDirection.Input, integrante));
            Actualizar(parametros);
        }

        public void GuardarIntegrante(string integrante)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@IntegranteAsXml", DbType.Xml, ParameterDirection.Input, integrante));
            EjecutarConsulta(ProcedimientosAlmacenados.Integrante.Insertar, parametros);
        }

        public Integrante ObtenerIntegrante(string nroDocumento, int tipoDocumento)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@NroDocumento", DbType.String, ParameterDirection.Input, nroDocumento));
            parametros.Add(CrearParametro("@TipoDocumento", DbType.Int64, ParameterDirection.Input, tipoDocumento));
            return Obtener<Integrante>(ProcedimientosAlmacenados.Integrante.ObtenerPorNroDoc, parametros).FirstOrDefault();
        }

        public Integrante ObtenerIntegrante(int integranteId)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@IntegranteId", DbType.Int64, ParameterDirection.Input, integranteId));
            return Obtener<Integrante>(ProcedimientosAlmacenados.Integrante.Obtener, parametros).FirstOrDefault();
        }

        public IList<ConsultaIntegrante> ObtenerIntegrantes()
        {
            IList<Parametro> parametros = new List<Parametro>();
            var resultado = Obtener<ConsultaIntegrante, Inscripciones>(ProcedimientosAlmacenados.Integrante.ObtenerTodos, parametros);
            foreach (var integrante in resultado.First)
            {
                ConsultaIntegrante integrante1 = integrante;
                var talleresIds = resultado.Second.Where(x => x.IntegranteId == integrante1.IntegranteId).Select(x => x.ActividadId);
                integrante.TalleresIds = talleresIds;
            }
            return resultado.First;
        }

        public IList<IntegranteAsisteActividad> AsistenAActividad(int actividadId)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@ActividadId", DbType.Int64, ParameterDirection.Input, actividadId));
            var resultado = Obtener<IntegranteAsisteActividad, AsisteComedorViandaDias>(ProcedimientosAlmacenados.Integrante.AsistenAActividad, parametros);
            foreach (var integrante in resultado.First)
            {
                var dias = resultado.Second.Where(x => x.IntegranteId == integrante.IntegranteId)
                         .Aggregate(new StringBuilder(), (sb, x) => sb.Append(ObtenerDia(x.DiaSemanaId)));
                integrante.Dias = dias.ToString();
            }
            return resultado.First;
        }

        private string ObtenerDia(int dia)
        {
            return " " + ((DiaSemana)dia).Descripcion();
        }
    }

    internal class Inscripciones
    {
        public int IntegranteId { get; set; }

        public int ActividadId { get; set; }
    }
}